home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-10-31 | 18.4 KB | 637 lines | [TEXT/PJMM] |
- unit MyAEUtils;
-
- interface
-
- uses
- {$IFC undefined THINK_Pascal}
- TextEdit,
- {$ENDC}
- AppleEvents;
-
- const
- typeMyPropertyToken = 'PTok';
- myPropertiesResType = 'MPRP';
-
- type
- SuspendedEvent = record
- waiting: boolean;
- event, reply: AppleEvent;
- dispatcher: EventHandlerProcPtr;
- refcon: longInt;
- end;
-
- procedure InitAEUtils (GetPropertyFromContainer, SetPropertyFromContainer: ProcPtr);
- { function GetPropertyFromContainer (prop: DescType; container: AEDesc; var result: AEDesc): OSErr;}
- { function SetPropertyFromContainer (prop: DescType; container: AEDesc; value: AEDesc): OSErr;}
-
- function GotRequiredParams (theAppleEvent: AppleEvent): OSErr;
-
- function AEGetDescPtr (desc: AEDesc; desiredType: DescType; p: ptr; maximumSize: Size; var actualSize: Size): OSErr;
-
- procedure AECreate (var desc: AEDesc);
- procedure AEDestroy (var desc: AEDesc); { dispose without error }
- function AENull: AEDesc;
-
- function CreateStringDesc (s: str255; var desc: AEDesc): OSErr;
- function CreateLongDesc (n: longInt; var desc: AEDesc): OSErr;
- function CreateTypeDesc (t: DescType; var desc: AEDesc): OSErr;
- function CreateBooleanDesc (b: boolean; var desc: AEDesc): OSErr;
- function CreateFSSpecDesc (fs: FSSpec; var desc: AEDesc): OSErr;
-
- function CreateSelfTarget (var desc: AEDesc): OSErr;
-
- { Guarentteed to preserve x on error }
- function GetStringFromAEDesc (desc: AEDesc; var x: str255): OSErr;
- function GetLongFromAEDesc (desc: AEDesc; var x: longInt): OSErr;
- function GetTypeFromAEDesc (desc: AEDesc; var x: DescType): OSErr;
- function GetBooleanFromAEDesc (desc: AEDesc; var x: boolean): OSErr;
- function GetFSSpecFromAEDesc (desc: AEDesc; var x: FSSpec): OSErr;
- function GetEnumeratedFromAEDesc (desc: AEDesc; var x: DescType): OSErr;
-
- { Guarentteed to preserve x on error }
- function GetStringFromAERecord (desc: AERecord; key: AEKeyword; var x: str255): OSErr;
- function GetLongFromAERecord (desc: AERecord; key: AEKeyword; var x: longInt): OSErr;
- function GetTypeFromAERecord (desc: AERecord; key: AEKeyword; var x: DescType): OSErr;
- function GetBooleanFromAERecord (desc: AERecord; key: AEKeyword; var x: boolean): OSErr;
- function GetFSSpecFromAERecord (event: AppleEvent; key: AEKeyword; var x: FSSpec): OSErr;
- function GetEnumeratedFromAERecord (event: AppleEvent; key: AEKeyword; var x: DescType): OSErr;
-
- function PutTESelectionToAERecord (desc: AERecord; key: AEKeyword; te: TEHandle): OSErr;
- function PutStringToAERecord (desc: AERecord; key: AEKeyword; s: str255): OSErr;
- function PutLongToAERecord (desc: AERecord; key: AEKeyword; n: longInt): OSErr;
- function PutDateToAERecord (desc: AERecord; key: AEKeyword; date: longInt): OSErr;
- function PutTypeToAERecord (desc: AERecord; key: AEKeyword; t: DescType): OSErr;
- function PutBooleanToAERecord (desc: AERecord; key: AEKeyword; b: boolean): OSErr;
- function PutFSSpecToAERecord (desc: AppleEvent; key: AEKeyword; fs: FSSpec): OSErr;
-
- function MyOAFindProperty (desiredClass: DescType; containerToken: AEDesc; containerClass: DescType; keyForm: DescType; keyData: AEDesc; var token: AEDesc; refcon: LongInt): OSErr;
- function SetPropertyFromToken (token: AEDesc; value: AEDesc): OSErr;
- function SetPropertyRecord (token: AEDesc; value: AEDesc): OSErr;
- function GetPropertyFromToken (token: AEDesc; var result: AEDesc): OSErr;
- function GetPropertyRecord (token: AEDesc; var result: AERecord): OSErr;
-
- function StorePropertyReferenceInToken (prop: DescType; container: AEDesc; var token: AEDesc): OSErr;
- function RetrievePropertyReferenceFromToken (token: AEDesc; var prop: DescType; var container: AEDesc): OSErr;
- function ValidProperty (class, prop: DescType): boolean;
- function GetIndProperty (class: DescType; index: integer; var prop: DescType): boolean;
- procedure SendSelfSimpleEvent (class_id, event_id: AEEventID);
-
- function NullSuspendedEvent: SuspendedEvent;
- function SuspendEvent (event, reply: AppleEvent; dispatcher: EventHandlerProcPtr; refcon: longInt; var se: SuspendedEvent): OSErr;
- procedure ResumeEvent (var se: SuspendedEvent);
-
- implementation
-
- uses
- {$IFC undefined THINK_Pascal}
- Resources,
- {$ENDC}
- AEObjects, AERegistry, MyStrings;
-
- var
- GetPropertyFromContainerProc: ProcPtr;
- SetPropertyFromContainerProc: ProcPtr;
-
- function CallGetPropertyFromContainer (prop: DescType; container: AEDesc; var result: AEDesc; p: ptr): OSErr;
- inline
- $205F, $4E90;
-
- function CallSetPropertyFromContainer (prop: DescType; container: AEDesc; value: AEDesc; p: ptr): OSErr;
- inline
- $205F, $4E90;
-
- {$S Init}
- procedure InitAEUtils (GetPropertyFromContainer, SetPropertyFromContainer: ProcPtr);
- begin
- GetPropertyFromContainerProc := GetPropertyFromContainer;
- SetPropertyFromContainerProc := SetPropertyFromContainer;
- end;
- {$S}
-
- procedure AECreate (var desc: AEDesc);
- begin
- desc.descriptorType := typeNull;
- desc.dataHandle := nil;
- end;
-
- function AENull: AEDesc;
- var
- desc: AEDesc;
- begin
- AECreate(desc);
- AENull := desc;
- end;
-
- procedure AEDestroy (var desc: AEDesc);
- var
- junk: OSErr;
- begin
- junk := AEDisposeDesc(desc);
- AECreate(desc);
- end;
-
- function GotRequiredParams (theAppleEvent: AppleEvent): OSErr;
- var
- typeCode: DescType;
- actualSize: Size;
- err: OSErr;
- begin
- err := AEGetAttributePtr(theAppleEvent, keyMissedKeywordAttr, typeWildCard, typeCode, nil, 0, actualSize); { nil ok: need only function result }
- if err = errAEDescNotFound then { we got all the required params: all is ok }
- GotRequiredParams := noErr
- else if err = noErr then
- GotRequiredParams := errAEEventNotHandled
- else
- GotRequiredParams := err;
- end; { GotRequiredParams }
-
- function AEGetDescPtr (desc: AEDesc; desiredType: DescType; p: ptr; maximumSize: Size; var actualSize: Size): OSErr;
- var
- err: OSErr;
- result: AEDesc;
- len: longInt;
- begin
- actualSize := 0;
- err := AECoerceDesc(desc, desiredType, result);
- if err = noErr then begin
- actualSize := GetHandleSize(result.dataHandle);
- len := actualSize;
- if len > maximumSize then
- len := maximumSize;
- BlockMove(result.dataHandle^, p, len);
- end;
- AEDestroy(result);
- AEGetDescPtr := err;
- end;
-
- function CreateSelfTarget (var desc: AEDesc): OSErr;
- var
- psn: ProcessSerialNumber;
- begin
- psn.lowLongOfPSN := kCurrentProcess;
- psn.highLongOfPSN := 0;
- CreateSelfTarget := AECreateDesc(typeProcessSerialNumber, @psn, SizeOf(psn), desc);
- end;
-
- function CreateStringDesc (s: str255; var desc: AEDesc): OSErr;
- begin
- CreateStringDesc := AECreateDesc(typeChar, @s[1], length(s), desc);
- end;
-
- function CreateLongDesc (n: longInt; var desc: AEDesc): OSErr;
- begin
- CreateLongDesc := AECreateDesc(typeLongInteger, @n, SizeOf(n), desc);
- end;
-
- function CreateTypeDesc (t: DescType; var desc: AEDesc): OSErr;
- begin
- CreateTypeDesc := AECreateDesc(typeType, @t, SizeOf(t), desc);
- end;
-
- function CreateBooleanDesc (b: boolean; var desc: AEDesc): OSErr;
- begin
- CreateBooleanDesc := AECreateDesc(typeBoolean, @b, SizeOf(b), desc);
- end;
-
- function CreateFSSpecDesc (fs: FSSpec; var desc: AEDesc): OSErr;
- begin
- CreateFSSpecDesc := AECreateDesc(typeFSS, @fs, SizeOf(fs), desc);
- end;
-
- function GetStringFromAEDesc (desc: AEDesc; var x: str255): OSErr;
- var
- result: AEDesc;
- err, junk: OSErr;
- begin
- err := AECoerceDesc(desc, typeChar, result);
- if err = noErr then begin
- HandleToString(result.dataHandle, x);
- AEDestroy(result);
- end;
- GetStringFromAEDesc := err;
- end;
-
- function GetLongFromAEDesc (desc: AEDesc; var x: longInt): OSErr;
- var
- len: longInt;
- err: OSErr;
- temp: longInt;
- begin
- err := AEGetDescPtr(desc, typeLongInteger, @temp, SizeOf(temp), len);
- if err = noErr then
- x := temp;
- GetLongFromAEDesc := err;
- end;
-
- function GetTypeFromAEDesc (desc: AEDesc; var x: DescType): OSErr;
- var
- len: longInt;
- err: OSErr;
- temp: DescType;
- begin
- err := AEGetDescPtr(desc, typeType, @temp, SizeOf(temp), len);
- if err = noErr then
- x := temp;
- GetTypeFromAEDesc := err;
- end;
-
- function GetBooleanFromAEDesc (desc: AEDesc; var x: boolean): OSErr;
- var
- len: longInt;
- err: OSErr;
- temp: boolean;
- begin
- err := AEGetDescPtr(desc, typeBoolean, @temp, SizeOf(temp), len);
- if err = noErr then
- x := temp;
- GetBooleanFromAEDesc := err;
- end;
-
- function GetFSSpecFromAEDesc (desc: AEDesc; var x: FSSpec): OSErr;
- var
- err: OSErr;
- len: longInt;
- temp: FSSpec;
- begin
- err := AEGetDescPtr(desc, typeFSS, @temp, SizeOf(temp), len);
- if err = noErr then
- x := temp;
- GetFSSpecFromAEDesc := err;
- end;
-
- function GetEnumeratedFromAEDesc (desc: AEDesc; var x: DescType): OSErr;
- var
- err: OSErr;
- begin
- err := noErr;
- if (GetHandleSize(desc.dataHandle) <> SizeOf(DescType)) then begin
- err := errAETypeError;
- end;
- if err = noErr then begin
- BlockMove(desc.dataHandle^, @x, SizeOf(x));
- end;
- GetEnumeratedFromAEDesc := err;
- end;
-
- function GetStringFromAERecord (desc: AERecord; key: AEKeyword; var x: str255): OSErr;
- var
- dummy: DescType;
- actual: Size;
- err: OSErr;
- temp: str255;
- begin
- err := AEGetKeyPtr(desc, key, typeChar, dummy, @temp[1], 255, actual);
- if err = noErr then begin
- temp[0] := chr(actual);
- x := temp;
- end;
- GetStringFromAERecord := err;
- end;
-
- function GetLongFromAERecord (desc: AERecord; key: AEKeyword; var x: longInt): OSErr;
- var
- dummy: DescType;
- actual: Size;
- err: OSErr;
- temp: longInt;
- begin
- err := AEGetKeyPtr(desc, key, typeLongInteger, dummy, @temp, SizeOf(temp), actual);
- if err = noErr then
- x := temp;
- GetLongFromAERecord := err;
- end;
-
- function GetTypeFromAERecord (desc: AERecord; key: AEKeyword; var x: DescType): OSErr;
- var
- dummy: DescType;
- actual: Size;
- err: OSErr;
- temp: DescType;
- begin
- err := AEGetKeyPtr(desc, key, typeType, dummy, @temp, SizeOf(temp), actual);
- if err = noErr then
- x := temp;
- GetTypeFromAERecord := err;
- end;
-
- function GetBooleanFromAERecord (desc: AERecord; key: AEKeyword; var x: boolean): OSErr;
- var
- dummy: DescType;
- actual: Size;
- err: OSErr;
- temp: boolean;
- begin
- err := AEGetKeyPtr(desc, key, typeBoolean, dummy, @temp, SizeOf(temp), actual);
- if err = noErr then
- x := temp;
- GetBooleanFromAERecord := err;
- end;
-
- function GetFSSpecFromAERecord (event: AppleEvent; key: AEKeyword; var x: FSSpec): OSErr;
- var
- dummy: DescType;
- actual: Size;
- err: OSErr;
- temp: FSSpec;
- begin
- err := AEGetKeyPtr(event, key, typeFSS, dummy, @temp, SizeOf(temp), actual);
- if err = noErr then
- x := temp;
- GetFSSpecFromAERecord := err;
- end;
-
- function GetEnumeratedFromAERecord (event: AppleEvent; key: AEKeyword; var x: DescType): OSErr;
- var
- err: OSErr;
- value: AEDesc;
- begin
- err := AEGetParamDesc(event, key, typeWildCard, value);
- if err = noErr then begin
- err := GetEnumeratedFromAEDesc(value, x);
- end;
- AEDestroy(value);
- GetEnumeratedFromAERecord := err;
- end;
-
- function PutTESelectionToAERecord (desc: AERecord; key: AEKeyword; te: TEHandle): OSErr;
- var
- h: handle;
- state: SignedByte;
- begin
- h := handle(TEGetText(te));
- state := HGetState(h);
- HLock(h);
- PutTESelectionToAERecord := AEPutKeyPtr(desc, key, typeChar, ptr(ord(h^) + te^^.selStart), te^^.selEnd - te^^.selStart);
- HSetState(h, state);
- end;
-
- function PutStringToAERecord (desc: AERecord; key: AEKeyword; s: str255): OSErr;
- begin
- PutStringToAERecord := AEPutKeyPtr(desc, key, typeChar, @s[1], length(s));
- end;
-
- function PutLongToAERecord (desc: AERecord; key: AEKeyword; n: longInt): OSErr;
- begin
- PutLongToAERecord := AEPutKeyPtr(desc, key, typeLongInteger, @n, SizeOf(n));
- end;
-
- function PutDateToAERecord (desc: AERecord; key: AEKeyword; date: longInt): OSErr;
- var
- longdate: record
- zero: longInt;
- date: longInt;
- end;
- begin
- longdate.zero := 0;
- longdate.date := date;
- PutDateToAERecord := AEPutKeyPtr(desc, key, 'ldt ', @longdate, SizeOf(longdate)); { typeLongDateTime }
- end;
-
- function PutTypeToAERecord (desc: AERecord; key: AEKeyword; t: DescType): OSErr;
- begin
- PutTypeToAERecord := AEPutKeyPtr(desc, key, typeType, @t, SizeOf(t));
- end;
-
- function PutBooleanToAERecord (desc: AERecord; key: AEKeyword; b: boolean): OSErr;
- begin
- PutBooleanToAERecord := AEPutKeyPtr(desc, key, typeBoolean, @b, SizeOf(b));
- end;
-
- function PutFSSpecToAERecord (desc: AppleEvent; key: AEKeyword; fs: FSSpec): OSErr;
- begin
- PutFSSpecToAERecord := AEPutKeyPtr(desc, key, typeFSS, @fs, SizeOf(fs));
- end;
-
- function StorePropertyReferenceInToken (prop: DescType; container: AEDesc; var token: AEDesc): OSErr;
- var
- h: handle;
- err: OSErr;
- begin
- h := nil;
- err := PtrToHand(@prop, h, SizeOf(DescType));
- if err = noErr then
- err := PtrAndHand(@container.descriptorType, h, SizeOf(DescType));
- if err = noErr then
- err := HandAndHand(container.dataHandle, h);
- if err = noErr then begin
- HLock(h);
- err := AECreateDesc(typeMyPropertyToken, h^, GetHandleSize(h), token);
- end;
- DisposeHandle(h);
- StorePropertyReferenceInToken := err;
- end;
-
- function RetrievePropertyReferenceFromToken (token: AEDesc; var prop: DescType; var container: AEDesc): OSErr;
- var
- conttype: DescType;
- err: OSErr;
- begin
- BlockMove(token.dataHandle^, @prop, SizeOf(DescType));
- BlockMove(ptr(ord(token.dataHandle^) + SizeOf(DescType)), @conttype, SizeOf(DescType));
- HLock(token.dataHandle);
- err := AECreateDesc(conttype, ptr(ord(token.dataHandle^) + 2 * SizeOf(DescType)), GetHandleSize(token.dataHandle) - 2 * SizeOf(DescType), container);
- HUnlock(token.dataHandle);
- if err <> noErr then begin
- AECreate(container);
- end;
- RetrievePropertyReferenceFromToken := err;
- end;
-
- type
- propertiesRecord = record
- count: integer;
- props: array[1..1000] of DescType;
- end;
- propertiesRecordPtr = ^propertiesRecord;
- propertiesRecordHandle = ^propertiesRecordPtr;
-
- function OSTypeToString (ost: OSType): Str15;
- var
- s: str15;
- begin
- s[0] := chr(4);
- BlockMove(@ost, @s[1], 4);
- OSTypeToString := s;
- end;
-
- function GetIndProperty (class: DescType; index: integer; var prop: DescType): boolean;
- var
- h: propertiesRecordHandle;
- begin
- h := propertiesRecordHandle(GetNamedResource(myPropertiesResType, OSTypeToString(class)));
- GetIndProperty := false;
- if h <> nil then begin
- if (0 < index) & (index <= h^^.count) then begin
- prop := h^^.props[index];
- GetIndProperty := true;
- end;
- HPurge(handle(h));
- end;
- end;
-
- function ValidProperty (class, prop: DescType): boolean;
- var
- h: propertiesRecordHandle;
- i: integer;
- begin
- h := propertiesRecordHandle(GetNamedResource(myPropertiesResType, OSTypeToString(class)));
- ValidProperty := false;
- if h <> nil then begin
- for i := 1 to h^^.count do begin
- if h^^.props[i] = prop then begin
- ValidProperty := true;
- leave;
- end;
- end;
- HPurge(handle(h));
- end;
- end;
-
- function MyOAFindProperty (desiredClass: DescType; containerToken: AEDesc; containerClass: DescType; keyForm: DescType; keyData: AEDesc; var token: AEDesc; refcon: LongInt): OSErr;
- var
- err: OSErr;
- prop: DescType;
- begin
- if keyForm = formPropertyID then begin
- err := GetTypeFromAEDesc(keyData, prop);
- if err = noErr then begin
- if ValidProperty(containerToken.descriptorType, prop) then begin
- err := StorePropertyReferenceInToken(prop, containerToken, token);
- end
- else begin
- err := errAENoSuchObject;
- end;
- end;
- end
- else begin
- err := errAEBadKeyForm;
- end;
- MyOAFindProperty := err;
- end;
-
- function SetPropertyFromToken (token: AEDesc; value: AEDesc): OSErr;
- var
- err, junk: OSErr;
- prop: DescType;
- container: AEDesc;
- begin
- err := RetrievePropertyReferenceFromToken(token, prop, container);
- if err = noErr then begin
- err := CallSetPropertyFromContainer(prop, container, value, SetPropertyFromContainerProc);
- end;
- AEDestroy(container);
- SetPropertyFromToken := err;
- end;
-
- function SetPropertyRecord (token: AEDesc; value: AEDesc): OSErr;
- var
- index: integer;
- prop: DescType;
- element: AEDesc;
- err, junk: OSErr;
- begin
- index := 1;
- while (err = noErr) & GetIndProperty(token.descriptorType, index, prop) do begin
- err := AEGetKeyDesc(value, prop, typeWildCard, element);
- if err = noErr then begin
- err := CallSetPropertyFromContainer(prop, token, element, SetPropertyFromContainerProc);
- AEDestroy(element);
- end
- else if err = errAEDescNotFound then begin
- err := noErr;
- end;
- index := index + 1;
- end;
- SetPropertyRecord := err;
- end;
-
- function GetPropertyFromToken (token: AEDesc; var result: AEDesc): OSErr;
- var
- err, junk: OSErr;
- prop: DescType;
- container: AEDesc;
- begin
- err := RetrievePropertyReferenceFromToken(token, prop, container);
- if err = noErr then begin
- err := CallGetPropertyFromContainer(prop, container, result, GetPropertyFromContainerProc);
- end;
- AEDestroy(container);
- GetPropertyFromToken := err;
- end;
-
- function GetPropertyRecord (token: AEDesc; var result: AERecord): OSErr;
- var
- index: integer;
- prop: DescType;
- element: AEDesc;
- err, junk: OSErr;
- begin
- err := AECreateList(nil, 0, true, result);
- index := 1;
- while (err = noErr) & GetIndProperty(token.descriptorType, index, prop) do begin
- err := CallGetPropertyFromContainer(prop, token, element, GetPropertyFromContainerProc);
- if err = noErr then begin
- err := AEPutKeyDesc(result, prop, element);
- AEDestroy(element);
- end
- else if err = errAEReadDenied then begin
- err := noErr;
- end;
- index := index + 1;
- end;
- if err <> noErr then begin
- AEDestroy(result);
- end;
- GetPropertyRecord := err;
- end;
-
- procedure SendSelfSimpleEvent (class_id, event_id: AEEventID);
- var
- event, reply: AppleEvent;
- err, junk: OSErr;
- psn: ProcessSerialNumber;
- target: AEDesc;
- begin
- AECreate(reply);
- err := CreateSelfTarget(target);
- err := AECreateAppleEvent(class_id, event_id, target, kAutoGenerateReturnID, kAnyTransactionID, event);
- AEDestroy(target);
- if err = noErr then begin
- junk := AESend(event, reply, kAENoReply + kAEAlwaysInteract, kAENormalPriority, kAEDefaultTimeOut, nil, nil);
- end;
- AEDestroy(event);
- AEDestroy(reply);
- end;
-
- function NullSuspendedEvent: SuspendedEvent;
- var
- se: SuspendedEvent;
- begin
- se.waiting := false;
- NullSuspendedEvent := se;
- end;
-
- function SuspendEvent (event, reply: AppleEvent; dispatcher: EventHandlerProcPtr; refcon: longInt; var se: SuspendedEvent): OSErr;
- var
- err: OSErr;
- begin
- se.event := event;
- se.reply := reply;
- se.dispatcher := dispatcher;
- se.refcon := refcon;
- err := AESuspendTheCurrentEvent(event);
- se.waiting := err = noErr;
- SuspendEvent := err;
- end;
-
- procedure ResumeEvent (var se: SuspendedEvent);
- var
- junk: OSErr;
- begin
- if se.waiting then begin
- se.waiting := false;
- junk := AEResumeTheCurrentEvent(se.event, se.reply, se.dispatcher, se.refcon);
- end;
- end;
-
- end.